package com.yupi.yuaicodemother.service;

import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.service.IService;
import com.yupi.yuaicodemother.model.dto.chathistory.ChatHistoryQueryRequest;
import com.yupi.yuaicodemother.model.entity.ChatHistory;
import com.yupi.yuaicodemother.model.entity.User;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;

import java.time.LocalDateTime;

/**
 * 对话历史 服务层。
 *
 * @author <a href="https://xiaolllei.blog.csdn.net/?type=blog">小雷</a>
 */
public interface ChatHistoryService extends IService<ChatHistory> {

    /**
     * 新增历史消息
     * @param appId             应用 ID
     * @param message           对话消息
     * @param messageType       消息类型 user、ai
     * @param userId            用户 id
     * @return                  保存结果
     */
    boolean addChatMessage(Long appId, String message, String messageType, Long userId);

    /**
     * 加载对话历史到缓存
     * @param appId         应用 id
     * @param chatMemory    对话记忆
     * @param maxCount      对话历史消息最大条数
     * @return
     */
    int loadChatHistoryToMemory(Long appId, MessageWindowChatMemory chatMemory, int maxCount);

    /**
     * 关联删除 appId 对应的对话历史
     * @param appId
     * @return
     */
    boolean deleteByAppId(Long appId);

    /**
     * 使用游标, 构造分页查询条件
     * @param chatHistoryQueryRequest  历史消息请求
     * @return                         分页查询条件
     */
    QueryWrapper getQueryWrapper(ChatHistoryQueryRequest chatHistoryQueryRequest);

    /**
     * 游标查询
     * @param appId
     * @param pageSize
     * @param lastCreateTime
     * @param loginUser
     * @return
     */
    Page<ChatHistory> listAppChatHistoryByPage(Long appId, int pageSize,
                                               LocalDateTime lastCreateTime, User loginUser);
}
